package com.sap.sap_mangers.service;


import com.sap.sap_mangers.Vo.BmsVo.BmsBorrowVo;
import com.sap.sap_mangers.Vo.BmsVo.BmsCategoryWithBookNumberVo;
import com.sap.sap_mangers.Vo.BmsVo.BmsManagerVo;
import com.sap.sap_mangers.Vo.BmsVo.BmsUserForTimeNoReturningVo;
import com.sap.sap_mangers.entity.Bms.BorrowNumberInEachMonth;
import com.sap.sap_mangers.pojo.SapBmsBook;
import com.sap.sap_mangers.pojo.SapBmsBorrow;
import com.sap.sap_mangers.pojo.SapBmsManagerSimpleInfo;
import com.sap.sap_mangers.until.SimpleJson;

import java.util.List;

/**
 * 图书管理系统 bms(Book Management System) service
 *
 * @author ZhouKai
 * 2022/8/8 21:16
 */
public interface BmsService {

    /**
     * 添加图书类别(名称) (可以按语言、方向等分类)
     *
     * @param categoryName 类别(名称)
     */
    void addBmsCategory(String categoryName);

    /**
     * 修改图书类别(名称)
     * 注意确保原编号存在
     * 没有设置删除:防止分类表中的编号找不到对应内容(没设置外键,随意删除不报错)
     *
     * @param oldCategoryName 原类别名称
     * @param newCategoryName 要修改成的类别名称
     * @return 编号不存在 或 新类别名称已存在 返回false
     */
    boolean updateBmsCategory(String oldCategoryName, String newCategoryName);

    /**
     * 获取所有类别
     *
     * @return 所有类别的名称
     */
    List<String> getAllCategory();

    /**
     * 填充管理员表
     * <p>
     * 清除原表中的数据，将当前(副)部长及以上职位用户加入管理表作为备用管理员，默认情况下刚更新管理表时只有会长直接是管理员
     * 事务支持
     */
    void fillBmsManagerTable();

    /**
     * 将新书加入到书籍表
     *
     * @param sapBmsBook 新书信息
     */
    void newBookIntoToBookTable(SapBmsBook sapBmsBook);

    /**
     * 建立书籍 与 类型 的关系（在书籍与类型关系对应表中）
     *
     * @param sapBmsBook 书籍信息
     */
    SimpleJson addBookInsertToBmsClassification(SapBmsBook sapBmsBook);

    /**
     * 对 将新书加入到书籍表 与 建立书籍 与 类型 的关系（在书籍与类型关系对应表中） 功能的汇总
     * 目的是进行事务处理
     *
     * @param sapBmsBook 书籍信息
     * @return 添加情况（添加成功则会包含书籍信息）
     */
    SimpleJson addBookInsertToBookTableAndBmsClassification(SapBmsBook sapBmsBook);

    /**
     * 获得所有书籍的信息
     *
     * @return 书籍信息
     */
    SimpleJson getAllBookInformation();

    /**
     * 根据类别查询书籍信息
     *
     * @param classification 类别
     * @return 书籍信息
     */
    SimpleJson getBookInformation(String classification);


    /**
     * 获取所有(备用/正式)管理员信息
     *
     * @return 管理员信息列表 (结果按职务对应的id和学号排序)
     */
    List<BmsManagerVo> getBmsManagerVos();

    /**
     * 设置让该(备用)管理人负责管理
     *
     * @param username (备用)管理人学号
     * @return Json
     */
    SimpleJson setTheManagerToBeResponsible(String username);

    /**
     * 撤销该(正式)管理员的职务
     * (至少要存在一个正式管理员)
     *
     * @param username (正式)管理员学号
     * @return Json
     */
    SimpleJson setTheManagerTeBeNotResponsible(String username);

    /**
     * 查询当前所有(正式)管理员
     *
     * @return 当前具有管理职责的管理员(正式管理员)信息的集合
     */
    List<BmsManagerVo> getBmsResponsibleManagerVos();

    /**
     * 修改书籍信息
     *
     * @param sapBmsBook 书籍信息
     * @return 修改情况
     */
    SimpleJson updateBookInformation(SapBmsBook sapBmsBook);


    /**
     * 申请借阅
     * 增加了同步锁，防止冲突
     *
     * @param username     申请人学号
     * @param sapBmsBorrow 借阅信息
     * @return Json
     */
    SimpleJson applyBorrow(String username, SapBmsBorrow sapBmsBorrow);

    /**
     * 申请归还 / 赔偿
     * 增加了同步锁，防止冲突
     *
     * @param username   申请人学号
     * @param borrowId   借阅记录的编号
     * @param borrowFlag 请求类型标识 true:申请归还 false:申请赔偿
     * @return Json
     */
    SimpleJson applyReturn(String username, Integer borrowId, Boolean borrowFlag);

    /**
     * 查询自己所有的借阅信息
     *
     * @return 借阅信息
     */
    SimpleJson getUserBorrowInformation();

    /**
     * 查询所有的借阅记录
     *
     * @return 借阅信息
     */
    SimpleJson getAllBorrowInformation();

    /**
     * 将超过预定时间的书籍状态 由 借阅中 修改为 超时未归还
     */
    void updateAllBookTimeoutNoReturn();

    /**
     * 查询未审核的借阅信息
     * (状态为 ‘申请中’的记录)
     *
     * @return 借阅记录
     */
    List<BmsBorrowVo> getRecordOfBorrowingApplication();

    /**
     * 查询未审核的归还/赔偿信息
     * (状态为 ‘申请归还’或‘申请赔偿’的记录)
     *
     * @return 借阅记录
     */
    List<BmsBorrowVo> getRecordOfReturningApplication();

    /**
     * 拿到所有超时未归还的用户的信息
     *
     * @return 所有的用户信息
     */
    List<BmsUserForTimeNoReturningVo> getAllUserMessageForBookTimeoutNoReturn();

    /**
     * 拿到所有图书管理员的简单信息：真实姓名 + QQ
     *
     * @return 简单信息
     */
    List<SapBmsManagerSimpleInfo> getSapBmsManagerSimpleInfos();

    /**
     * 审批借阅信息
     *
     * @param bmsBorrowVo 需要审批的信息
     * @return 审批情况
     */
    SimpleJson checkBorrowInformation(BmsBorrowVo bmsBorrowVo);

    /**
     * 手动修改借阅状态
     * 只允许所有管理层使用
     *
     * @param borrowId 借阅记录编号
     * @param state    要修改的状态
     * @return Json
     */
    SimpleJson modifyBorrowStateManually(Integer borrowId, String state);

    /**
     * 审批归还信息
     *
     * @param bmsBorrowVo 管理员给的审批操作
     * @return 审批结果
     */
    SimpleJson checkBookReturnInformation(BmsBorrowVo bmsBorrowVo);

    /**
     * 获取书籍类别及对应其书籍数量 (一本书可以有多个类别)
     *
     * @return 书籍类别及其对应书籍数量视图对象集合
     */
    List<BmsCategoryWithBookNumberVo> getCategoryWithBookNumber();

    /**
     * 取消 借阅申请 或 归还申请
     *
     * @param bmsBorrowId 编号
     * @param type        类型 (0：取消借阅； 1：取消归还)
     * @return Json (没有对应类型直接返回null)
     */
    SimpleJson cancelBorrowOrReturnApplication(Integer bmsBorrowId, int type);

    /**
     * 获取 过去一年中每个月的借阅申请次数
     *
     * @return 过去一年中每个月的借阅申请次数
     */
    List<BorrowNumberInEachMonth> getBorrowNumberEachMonthInThePastYear();
}
